/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.dubbo.remoting.exchange.support.header;

import org.apache.dubbo.common.URL;
import org.apache.dubbo.remoting.RemotingException;
import org.apache.dubbo.remoting.Transporters;
import org.apache.dubbo.remoting.exchange.ExchangeClient;
import org.apache.dubbo.remoting.exchange.ExchangeHandler;
import org.apache.dubbo.remoting.exchange.ExchangeServer;
import org.apache.dubbo.remoting.exchange.Exchanger;
import org.apache.dubbo.remoting.transport.DecodeHandler;

/**
 * DefaultMessenger
 * <p>
 * 基于**头部协议（Header Protocol）**的消息交换机制
 */
public class HeaderExchanger implements Exchanger {

    public static final String NAME = "header";

    // 客户端的连接操作，用于创建一个 ExchangeClient 实例，通过它可以与远程服务器进行通信。
    /**
     * Transporters.connect()：这个方法是连接远程服务器的入口。
     * Transporters 是 Dubbo 中用于创建传输层对象的工厂类，负责根据传入的 URL 和处理器（ChannelHandler）创建客户端连接。
     * DecodeHandler：用于处理消息的解码。它是一个 ChannelHandler，负责将底层的字节流（或其他格式的消息）转换为 Dubbo 内部的消息对象。
     * 在这里，它包装了 HeaderExchangeHandler。
     * HeaderExchangeHandler：这是一个核心的处理器，它将 ExchangeHandler 包装起来，处理基于头部协议的消息交换逻辑。
     * ExchangeHandler 是 Dubbo 中用于处理请求和响应的接口。
     * HeaderExchangeClient：这是一个 ExchangeClient 实现类，它表示一个基于头部协议的客户端。
     * 它使用了 Transporters.connect() 创建的客户端连接，并添加了消息交换能力（如请求-响应机制）。
     *
     * 工作流程：
     * 当客户端通过 connect() 方法发起连接时，Transporters.connect() 会创建底层的网络连接，DecodeHandler 处理消息的解码，
     * HeaderExchangeHandler 负责处理消息交换的逻辑，最终返回一个封装了所有这部分逻辑的 HeaderExchangeClient 实例。
     * @param url
     * @param handler
     * @return
     * @throws RemotingException
     */
    @Override
    public ExchangeClient connect(URL url, ExchangeHandler handler) throws RemotingException {
        return new HeaderExchangeClient(Transporters.connect(url, new DecodeHandler(new HeaderExchangeHandler(handler))), true);
    }

    /**
     * 服务端的绑定操作，用于创建一个 ExchangeServer 实例，通过它可以监听请求并响应。
     * Transporters.bind()： 方法用于在服务端绑定一个地址（通过 URL 参数指定），并监听来自客户端的连接。
     * * 类似于 connect()，它也是通过 Transporters 来创建底层的传输层服务。
     * DecodeHandler：与 connect() 中一样，DecodeHandler 用于处理消息的解码。
     * HeaderExchangeHandler：与 connect() 中一样，HeaderExchangeHandler 用于处理基于头部协议的消息交换逻辑。
     * HeaderExchangeServer：这是一个 ExchangeServer 实现类，表示一个基于头部协议的服务端。
     * 它负责接收客户端的请求，并通过 ExchangeHandler 处理这些请求。
     *
     *
     * 工作流程：
     * 当服务端通过 bind() 方法绑定服务时，Transporters.bind() 会监听指定的地址，
     * 并通过 DecodeHandler 处理来自客户端的消息解码，HeaderExchangeHandler
     * 处理消息的请求和响应，最终返回一个 HeaderExchangeServer实例，用于处理客户端的请求。
     */
    @Override
    public ExchangeServer bind(URL url, ExchangeHandler handler) throws RemotingException {
        return new HeaderExchangeServer(Transporters.bind(url, new DecodeHandler(new HeaderExchangeHandler(handler))));
    }

}
